/* 
 * File:   filme.h
 * Author: fguira
 *
 * Created on 17 de setembro de 2011, 13:33
 */

#ifndef FILME_H
#define	FILME_H
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <vector>
#include <algorithm>
#include<cstring>

class Filme {//classe onde está os registros do filme
private:
    char key[5];
    std::string portTitle;
    std::string originTitle;
    std::string director;
    char releaseYear[4];
    std::string country;
    char stars;
public:
    friend void setKey(Filme &A);
    std::string getCountry() const;

    std::string getDirector() const;

    char* getKey() const;

    std::string getOriginTitle() const;

    std::string getPortTitle() const;

    char* getReleaseYear() const;

    char getStars() const;
    
    void setStars(char stars);
    
    Filme(std::string port, std::string orig, std::string dir,  std::string ano, std::string pais, char nota);
    

};

class IndicePrimario { //classe que contém os dados do índice primário
private:
    char key[5];
    int endereco;
public:
    char* getkey() const;
    int getendereco() const;
    IndicePrimario(char* pkey, int r);
    bool operator< (const IndicePrimario &A) const;
    bool operator== (const IndicePrimario &A) const;
};

class IndiceSecundario {//classe que contém os dados que contém o índice secundário
private:
    char key[5];
    std::string portTitle;
    
public:
    char* getkey() const;
    std::string getportTitle() const;
    IndiceSecundario(char* pkey, std::string port);
    bool operator< (const IndiceSecundario &A) const;
    bool operator== (const IndiceSecundario &A) const;
    
};
/*Função que verifica se os arquivos de índice e registro existem, 
 senão os cria e coloca uma flag no arquivo.*/
void abreArquivos();

/*Função onde o usuário insere os registros de um determinado filme*/
void inserirFilme(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS);

/*Função que dá upper case nas strings e chars*/
void maiuscula(std::string & str);

/*Função que grava no arquivo movie.dat os registros de um determinado filme*/
bool registrarArquivo(const Filme *xpto, int &i, std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS);

/*Função que copia o índice primário para a memória principal*/
void copiaIndicePrimario(std::vector<IndicePrimario> *iP);

/*Função que copia o índice secundário para a memória principal*/
void copiaIndiceSecundario(std::vector<IndiceSecundario> *iS);

/*Salva índice primário no arquivo iprimary.idx*/
void salvarIndice(std::vector<IndicePrimario> *iP);

/*Salva índice secundário no arquivo ititle.idx*/
void salvaIndiceSec(std::vector<IndiceSecundario> *iS);

/*Função que ordena os índices primários e secundário na memória principal*/
void ordenarIndice(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS);

/*Função que mostra ao compilador como ordenar o vetor com a classe de índice primário*/
bool ordenaPorChave(IndicePrimario A, IndicePrimario B);

/*Função que mostra ao compilador como ordenar o vetor com a classe de secundário
 utilizando o título em português*/
bool ordenaPorTitulo(IndiceSecundario A, IndiceSecundario B);

/*Função que busca no índice primário a chave primária */
bool buscaChave(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS);

/*Função que busca no índice primário a chave primária, dada uma chave de busca e uma flag */
bool buscaChave(std::vector<IndicePrimario> *iP, char* busca, int modifica);

/*Função que busca no índice secundário o título do filme */
bool buscaTitulo(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS);

/*Função que define ao compilador como ordenar a na classe o atributo chave primária 
 no índice primário*/
bool verificaChave(IndicePrimario A, const char* busca);

/*Função que define ao compilador como ordenar a na classe o atributo chave primária 
 no índice secundário*/
bool verificaChave(IndiceSecundario A, const char* busca);

/*Função que carrega um registro para consulta, alteração ou remoção*/
void carregaRegistro(std::vector<IndicePrimario> *iP, int rrn, int modifica);

/*Função que salva os índices primário e secundário da memória principal para os seus 
 respectivos arquivos*/
bool salvarArquivo(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS);

/*Função que lista todos os filmes registrados no arquivo movie.dat*/
void listarFilme(std::vector<IndicePrimario> *iP);

/*Função que modifica a nota de um dado filme registrado*/
bool mudarNotaFilme(std::vector<IndicePrimario> *iP);

/*Função de apoio para para as funções mudar nota filme e apagar filme*/
bool modificaRegistro( const Filme *xpto, int &rrn);

/*Função que remove um dado filme selecionado*/
bool apagarFilme(std::vector<IndicePrimario> *iP, std::vector<IndiceSecundario> *iS);
#endif	/* FILME_H */

